package io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 写出文本数据
 */
public class WriteStringDemo {
    public static void main(String[] args) throws IOException {
        //向文件中写入字符串
        /*
            文件流的两种模式:
            覆盖模式:
            FileOutputStream(String fileName)
            FileOutputStream(File file)
            覆盖模式:当文件流创建时若指定的文件已经存在，则会清空文件原本内容
            意味着文件流连上后，该文件就变成了一个空文件

            追加模式:
            FileOutputStream(String fileName,boolean append)
            FileOutputStream(File file,boolean append)
            如果第二个参数为true,则开启追加模式，否则还是覆盖模式。
            追加模式:当文件流创建时若指定的文件已经存在，则不会清空文件原本内容，而是追加内容
         */
        FileOutputStream fos = new FileOutputStream("fos1.txt",true);
        //毛不易:无名的人
        String line = "当家乡入冬的时候，列车到站以后,小时候的风在吹过。";
        /*
            00000000  ASC编码
            00000000 00000000 UNICODE 常用文字部分

            01100001  01100010
               a         b

            读取时: 01100001 01100010 每个字节单独看:a b
                   当成两个字节看：也许是一个汉字:我(只是假设)

            UTF-8 在unicode编码中加入长度信息让接收方识别
            规则:英文部分就是单字节，以0开始
                00000000-01111111    0-127

                中文需要使用三字节，原本unicode中每个中文2字节，还要加入长度信息因此要扩城3字节
                例如:汉字:"我" 对应的2进制为 01101010 00111100 (乱写的，明白道理即可)
                添加长度信息:
                vvvv :1110开始，表示要连续读取3个字节    同理:1100开始 表示连续读取2字节。 1111开始则连续读取4个字节
                1110xxxx 10xxxxxx 10xxxxxx

                后面紧跟的几个字节都是以10开始的
                         vv       vv
                1110xxxx 10xxxxxx 10xxxxxx

                汉字:"我" 对应的2进制为 01101010 00111100
                    0110   101000   111100
                11100110 10101000 10111100
                    ^^^^   ^^^^^^   ^^^^^^  x的部分就是该字符原本unicode内容

               中文部分就是在UTF-8中三字节部分

               总结:
               UTF-8中，英文部分占1个字节(原始asc编码)
                       中文占3个字节

         */
        /*
            String提供了将字符串转换为一组字节的方法
            byte[] getBytes(Charset csn)
            按照指定的字符集将当前字符串内容转换为一组字节
         */
        byte[] data = line.getBytes(StandardCharsets.UTF_8);
        fos.write(data);

        line = "回忆最单纯的快乐，在熟悉的街头，有人会有所有的温柔，喊出你的名字。";
        data = line.getBytes(StandardCharsets.UTF_8);
        fos.write(data);

        System.out.println("写出完毕");
        fos.close();

    }
}





